/**************************** (C) COPYRIGHT 2018 Fortiortech shenzhen *****************************
* File Name          : Customer.h
* Author             : Bruce, Fortiortech Hardware
* Version            : V1.0
* Date               : 2018-02-26
* Description        : This file contains all the common data types used for
*                      Motor Control.
***************************************************************************************************
* All Rights Reserved
**************************************************************************************************/

/* Define to prevent recursive inclusion --------------------------------------------------------*/
#ifndef __CUSTOMER_H_
#define __CUSTOMER_H_

/*芯片参数值-------------------------------------------------------------------*/
/*CPU and PWM Parameter*/
#define MCU_CLOCK                       (24.0)                                  // (MHz) 主频
#define PWM_FREQUENCY                   (16.0)                                  // (kHz) 载波频率

/*deadtime Parameter*/
#define PWM_DEADTIME                    (0.8)                                   // (us) 死区时间  0.8 

/*single resistor sample Parameter*/
#define MIN_WIND_TIME                   (PWM_DEADTIME+0.8)                                   // (us) 单电阻最小采样窗口，建议值死区时间+0.9us 2.2

/*电机参数值-------------------------------------------------------------------*/

#define Pole_Pairs (8.0f) // Number of motor pole pairs
#define RS (1.6f)         // Stator resistance , ohm
#define LD (0.003 * 0.7) // D axis inductance , H
#define LQ (0.003 * 0.7) // Q axis inductance , H
#define Ke (1.9)
#define MOTOR_SPEED_BASE (780.0) // (RPM) 速度基准

#if 0
#define Pole_Pairs (8.0) // Number of motor pole pairs
#define RS (1.6)         // Stator resistance , ohm
#define LD (0.0035)      // D axis inductance , H
#define LQ (0.0035)      // Q axis inductance , H
#define Ke (27.9)
#define MOTOR_SPEED_BASE (780.0) // (RPM) 速度基准
#endif

/*硬件板子参数设置值------------------------------------------------------------*/

/*电机电流采样相关硬件参数*/
/* 运放1、运放2放大倍数以及相电流采样电阻参数设置 */
#define HW_RSHUNT                       (0.0333)                                 // (Ω)  采样电阻
#define HW_AMPGAIN                      (8.0)                                   // 运放放大倍数
#define HW_ADC_REF                      (5.0)                                   // (V)  ADC参考电压
/* 运放0放大倍数以及母线电流采样电阻参数设置 */
#define HW_RSHUNT0                      (0.0333)
#define HW_AMPGAIN0                     (8.0)
#define AMP0_OffSet                     (1)                                     // 0：AMP0没偏置电阻；1：AMP0有偏置电阻

#define AMP0GAIN_2x                     (1)                                     // 芯片内部2倍放大
#define AMP0GAIN_4x                     (2)                                     // 芯片内部4倍放大
#define AMP0GAIN_8x                     (3)                                     // 芯片内部8倍放大
#define AMP0GAIN_16x                    (4)                                     // 芯片内部16倍放大
#define AMP0GAIN_32x                    (5)                                     // 芯片内部32倍放大
#define MCU_AMP0GAIN                    (AMP0GAIN_8x)                           // 选择内部运放的倍数

#define Inter_AMP0                      (0)                                     // 内部运放0
#define Exter_AMP0                      (1)                                     // 外部运放0
#define AMP0Mode                        (Inter_AMP0)                            // 运放0模式选择

/*电机驱动母线电压采样相关硬件参数*/
#define RV1                             (11.0)                                  // (kΩ) 母线电压分压电阻1
#define RV2                             (0.0)                                   // (kΩ) 母线电压分压电阻2
#define RV3                             (1.0)                                   // (kΩ) 母线电压分压电阻3
#define VC1                             (1.0)                                   // 电压补偿系数
#define RV                              ((RV1 + RV2 + RV3) / RV3)               // 分压比
#define HW_BOARD_VOLT_MAX               (HW_ADC_REF * RV)                       // (V)  ADC可测得的最大母线电压

/*时间设置值-------------------------------------------------------------------*/
#define Calib_Time                      (500)                                  // 校正次数，固定1000次，单位:次
#define Charge_Time                     (1)                                    // (ms) 预充电时间，单位：ms
#define Align_Time                      (80)                                     // (ms) 预定位时间，单位：ms

/*正常运行时估算算法的参数设置值-------------------------------------------------*/
#define OBS_KSLIDE                      _Q15(0.85)                              // SMO算法里的滑膜增益值
#define E_BW                            (450.0)                                 // PLL算法里的反电动势滤波值
/*逆风判断时的估算算法设置值-----------------------------------------------------*/
#define TailWind_Time                   (300)                                   // (ms) 顺逆风检测时间
#define ATO_BW_Wind                     (40.0)//120.0-PLL 120.0-smo             // 逆风判断观测器带宽的滤波值，经典值为8.0-100.0
#define SPD_BW_Wind                     (5.0)//10.0-PLL  ,10.0-smo             // 逆风判断速度带宽的滤波值，经典值为5.0-40.0
/**逆风顺--------------------------*/
/*********** RPD parameter *********风状态下的KP、KI****/
#define DQKP_TailWind                   _Q12(0.8)                               //_Q12(1.0)-PLL , _Q12(1.5)-smo
#define DQKI_TailWind                   _Q15(0.1)                             //_Q15(0.08)-PLL ,_Q15(0.2)-smo
/*启动参数参数值--------------------------------------**/
/******* 初始位置检查参数 **********/
#define AlignTestMode                   (0)                                     // 预定位测试模式

/***预定位的Kp、Ki****/
#define DQKP_Alignment                  _Q12(0.3)                               // 预定位的KP
#define DQKI_Alignment                  _Q15(0.002)                              // 预定位的KI
#define ID_Align_CURRENT                I_Value(0.8)                            // (A) D轴定位电流
#define IQ_Align_CURRENT                I_Value(0.0)                            // (A) Q轴定位电流
#define Align_Angle                     (60.0)                                   // (°) 预定位角度

/***启动电流****/
#define ID_Start_CURRENT                I_Value(0.0)                            // (A) D轴启动电流
#define IQ_Start_CURRENT                I_Value(1.0)                           // (A) Q轴启动电流

/***运行电流****/
#define ID_RUN_CURRENT                  I_Value(0.0)                            // (A) D轴运行电流
#define IQ_RUN_CURRENT                  I_Value(0.4)                           // (A) Q轴运行电流

/***限制电流****/
#define LIMIT_MIN_CURRENT               I_Value(0.15)                           // (A) Q轴限制电流.

#define POWER_OFF_CURRENT               I_Value(0.01)			                // 关机电流，关机前先将电流降至该值

/*************Omega启动的参数***************/
#define ATO_BW                         (5.0)                                   // 观测器带宽的滤波值，经典值为1.0-200.0

#define ATO_BW_RUN                     (6.0)
#define ATO_BW_RUN1                    (6.0)
#define ATO_BW_RUN2                    (8.0)
#define ATO_BW_RUN3                    (10.0)
#define ATO_BW_RUN4                    (20.0)
#define ATO_BW_RUN5                    (46.0) 

#define SPD_BW                          (16.0)                                  // 速度带宽的滤波值，经典值为5.0-40.0
#define ATT_COEF                        (0.85)                                  // 无需改动
/*转速参数值-------------------------------------------------------------------*/
/* motor start speed value */
//open 算法启动参数
#define MOTOR_OPEN_ACC                  (1)                                 // 强拖启动的增量(每载波周期加一次)
#define MOTOR_OPEN_ACC_MIN              (0.05)                                  // 强拖启动的初始速度
#define MOTOR_OPEN_ACC_CNT              (20)                                    // 强拖启动的执行次数(MOTOR_OPEN_ACC_CNT*256)
#define MOTOR_OPEN_ACC_CYCLE            (3)                                   /* 仅Open有效*/// 强拖启动循环拖动的次数
  
//OMEGA启动参数
#define Motor_Omega_Ramp_ACC            (4)                                   // omega启动的增量   12
#define MOTOR_OMEGA_ACC_MIN             (2.0)                                  // (RPM) omega启动的最小切换转速
#define MOTOR_OMEGA_ACC_END             (6.0)                                  // (RPM) omega启动的限制转速

/* motor loop control speed value */
#define MOTOR_LOOP_RPM                  (25.0) //90                            // (RPM) 由mode 0到mode1切换转速，即闭环切换转速

/* motor run speed value */
//电机运行时最大最小转速、堵转保护转速
#define MOTOR_SPEED_SMOMIN_RPM          (12.0) //20                             // (RPM) SMO运行最小转速
#define MOTOR_SPEED_MIN_RPM             (80.0)                                  // (RPM) 运行最小转速
#define MOTOR_SPEED_MAX_RPM             (700.0)                                 // (RPM) 运行最大转速
#define MOTOR_SPEED_LIMIT_RPM           (700.0)
#define MOTOR_SPEED_STAL_MAX_RPM        (700.0)                                 // (RPM) 堵转保护转速
#define MOTOR_SPEED_STAL_MIN_RPM        (100.0)

#define MOTOR_SPEED_STOP_RPM            (100.0)                                  // (RPM) 运行最小转速

#define Motor_Max_Power                 (4000)
#define Motor_Min_Power                 (400)
/*电机开机、关机的设置----------------------------------------------------------*/
/* motor ON/0FF value */
#define OFFPWMDuty                      _Q15(0.08)                              // 关机PWM占空比，小于该占空比关机                 
#define OFFPWMDutyHigh                  _Q15(1.0)                               // 关机PWM占空比，大于该占空比关机
#define ONPWMDuty                       _Q15(0.05)                              // 开机PWM占空比，大于该占空比时开机
#define MINPWMDuty                      _Q15(0.05)                              // 速度曲线上最小PWM占空比
#define MAXPWMDuty                      _Q15(1.0)                               // 速度曲线上最大PWM占空比

/*******运行时的参数*****************/
/*电流环参数设置值--------------------------------------------------------------*/
#define DQKPStart                       _Q12(0.8)                               // DQ轴KP
#define DQKIStart                       _Q15(0.02)                              // DQ轴KI
 
#define DQKP                            _Q12(0.4)                               // DQ轴KP
#define DQKI                            _Q15(0.01)                              // DQ轴KI
/* D轴参数设置 */
#define DOUTMAX                         _Q15(0.50)                              // D轴最大限幅值，单位：输出占空比
#define DOUTMIN                         _Q15(-0.50)                             // D轴最小限幅值，单位：输出占空比
/* Q轴参数设置，默认0.99即可 */
#define QOUTMAX                         _Q15(0.98)                              // Q轴最大限幅值，单位：输出占空比
#define QOUTMIN                         _Q15(-0.98)                             // Q轴最小限幅值，单位：输出占空比

#define QOUTMIN_Start                   _Q15(0.02)                             // Q轴最小限幅值，单位：输出占空比

#define QOUTINC                         (10)                                     // Q轴电流增大步进值,开环控制时有效
#define QOUTCURRENT                     (0.25)                                   // (A) Q轴输出电流,开环控制时有效1.5A对应功率260W
#define QOUTMAXVALUE                    I_Value(QOUTCURRENT)
#define QOUTMINVALUE                    I_Value(0.1)

/*外环参数设置值----------------------------------------------------------------*/
#define SpeedloopDeley_Time             (4000)                                  // (ms) 速度环相应延长时间
#define SPEED_LOOP_TIME                 (60)                                    // (ms) 速度环调节周期 风扇速度环50，功率环5

#define SPEED_BREAK_TIME0               (280)
#define SPEED_BREAK_TIME1               (1980)

#define SKP                             _Q12(0.9)                               // 外环KP
#define SKI                             _Q15(0.058)                              // 外环KI
#define SKD                             _Q12(0.00)                              // 外环KD

#define SOUTMAX                         I_Value(3.8)                            // (A) 外环最大限幅值
#define SOUTMIN                         I_Value(0.02)                           // (A) 外环最小限幅值

#define SPEED_INC                       (1.0)                                   // 速度环增量
#define SPEED_DEC                       (0.6)                                   // 速度环减量

/*外环使能*/
#define OUTLoop_Disable                 (0)                                     // 关闭外环
#define OUTLoop_Enable                  (1)                                     // 使能外环
#define OUTLoop_Mode                    (OUTLoop_Enable)

/*外环选择功率环或速度环*/
#define POWER_LOOP_CONTROL              (0)                                     // 恒功率
#define SPEED_LOOP_CONTROL              (1)                                     // 恒转速
#define Motor_Speed_Control_Mode        (POWER_LOOP_CONTROL)


#define POWER_LIMIT_ENALBE             (1)								                    	//限功率使能
#define MOTOR_LIMIT_POWER              (40.0)                                  // 运行最高的限制功率（W）  15->35W
#define POWER_LIMIT_VALUE              _Q15(MOTOR_LIMIT_POWER/MOTOR_POWER_BASE*POWER_REG_K)
#define MOTOR_POWER_BASE                (80.0)
#define POWER_REG_K                     (0.215)                                   // FOC_POW寄存器值与实际功率比例系数

/*定义7档转速值，其中0档为关机档位*/
#define MOTOR_SPEED_LEVEL_7             _Q15(375.0/MOTOR_SPEED_BASE)
#define MOTOR_SPEED_LEVEL_6             _Q15(331.0/MOTOR_SPEED_BASE)
#define MOTOR_SPEED_LEVEL_5             _Q15(285.0/MOTOR_SPEED_BASE)
#define MOTOR_SPEED_LEVEL_4             _Q15(247.0/MOTOR_SPEED_BASE)
#define MOTOR_SPEED_LEVEL_3             _Q15(203.0/MOTOR_SPEED_BASE)
#define MOTOR_SPEED_LEVEL_2             _Q15(162.0/MOTOR_SPEED_BASE)
#define MOTOR_SPEED_LEVEL_1             _Q15(118.0/MOTOR_SPEED_BASE)
#define MOTOR_SPEED_LEVEL_0             _Q15(0.0/MOTOR_SPEED_BASE)

#define MOTOR_FR_SPEED_LEVEL_7          _Q15(120.0/MOTOR_SPEED_BASE)


#define MOTOR_POWER_LEVEL_6             _Q15(300.0/MOTOR_SPEED_BASE)
#define MOTOR_POWER_LEVEL_5             _Q15(300.0/MOTOR_SPEED_BASE)
#define MOTOR_POWER_LEVEL_4             _Q15(260.0/MOTOR_SPEED_BASE)
#define MOTOR_POWER_LEVEL_3             _Q15(220.0/MOTOR_SPEED_BASE)
#define MOTOR_POWER_LEVEL_2             _Q15(180.0/MOTOR_SPEED_BASE)
#define MOTOR_POWER_LEVEL_1             _Q15(180.0/MOTOR_SPEED_BASE)
#define MOTOR_POWER_LEVEL_0             _Q15(0.0/MOTOR_SPEED_BASE)
//调速模式
#define PWMMODE                         (0)                                     // PWM调速
#define NONEMODE                        (1)                                     // 直接给定值，不调速
#define OTHERMODE                       (2)                                     // 其它控制方式
#define SPEED_MODE                      (OTHERMODE)

/*估算器模式选择*/
#define SMO                             (0)                                     // SMO ,滑膜估算
#define PLL                             (1)                                     // PLL ,锁相环
#define EstimateAlgorithm               (SMO)

/*顺逆风判断设置*/
#define NoTailWind                      (0)                                     // 无逆风顺风判断
#define TailWind                        (1)                                     // 逆风顺风判断
#define TailWind_Mode                   (TailWind)

/*顺逆风判断方法*/
#define RSDMethod                       (0)                                     // RSD比较器方法
#define BEMFMethod                      (1)                                     // BEMF方法
#define FOCMethod                       (2)                                     // FOC计算方法
#define FRDetectMethod                  (FOCMethod)

/*开环启动模式选择*/
#define Open_Start                      (0)                                     // 开环强拖启动
#define Omega_Start                     (1)                                     // Omega启动
#define Open_Omega_Start                (2)                                     // 先开环启，后Omega启动
#define Open_Low_Theta_Start            (3)                                    // 低速角度启动
#define Open_Start_Mode                 (Open_Omega_Start)

/*电流采样模式*/
#define Single_Resistor                 (0)                                     // 单电阻电流采样模式
#define Double_Resistor                 (1)                                     // 双电阻电流采样模式
#define Three_Resistor                  (2)                                     // 三电阻电流采样模式
#define Shunt_Resistor_Mode             (Single_Resistor)                       // 6832s只能用单电阻

#define OverModulation                  (0)                                     // 0-禁止过调制，1-使能过调制
#define IRMODE                          (0)                                     // 正反转模式，正转为0，反转为1
/*保护参数值-------------------------------------------------------------------*/
/*硬件过流保护*/
#define Hardware_FO_Protect             (1)                                     // 硬件FO过流保护使能，适用于IPM有FO保护的场合
#define Hardware_CMP_Protect            (2)                                     // 硬件CMP比较过流保护使能，适用于MOS管应用场合
#define Hardware_FO_CMP_Protect         (3)                                     // 硬件CMP比较和FO过流保护都使能
#define Hardware_Protect_Disable        (4)                                     // 硬件过流保护禁止，用于测试
#define HardwareCurrent_Protect         (Hardware_CMP_Protect)                  // 硬件过流保护实现方式

/*硬件过流保护比较值来源*/
#define Compare_DAC                     (0)                                     // DAC设置硬件过流值
#define Compare_Hardware                (1)                                     // 硬件设置硬件过流值
#define Compare_Mode                    (Compare_DAC)                           // 硬件过流值的来源

#define OverHardcurrentValue            (5.5)                                   // (A) DAC模式下的硬件过流值

/*软件过流保护*/
#define OverSoftCurrentValue            I_Value(5.0)                            // (A) 软件过流值

/*过流恢复*/
#define CurrentRecoverEnable            (1)                                     // 过流保护使能位, 0，不使能；1，使能
#define OverCurrentRecoverTime          (1000)                                  // (ms) 过流保护恢复时间

#define VoltageProtectEnable            (1)                                     // 电压保护，0,不使能；1，使能
#define StartProtectEnable              (1)                                     // 启动保护，0,不使能；1，使能
#define StallProtectEnable              (1)                                     // 堵转保护，0,不使能；1，使能
#define PhaseLossProtectEnable          (1)                                     // 缺相保护，0,不使能；1，使能

/*过欠压保护*/
#define Over_Protect_Voltage            (30)                                    // (V) 直流电压过压保护值
#define Over_Recover_Vlotage            (28)                                    // (V) 直流电压过压保护恢复值
#define Under_Protect_Voltage           (15)                                    // (V) 直流电压欠压保护值
#define Under_Recover_Vlotage           (17)                                     // (V) 直流电压欠压保护恢复值

/*缺相保护*/
#define PhaseLossCurrentValue           I_Value(0.2)                            // (A)  缺相电流值
#define PhaseLossLowCurrent             (100) //200                             // 缺相电流下限
#define PhaseLossHighCurrent            (1000)
#define PhaseLossRecoverTime            (1000)                                   // (ms) 缺相保护时间

/*堵转保护*/
#define StallCurrentValue1              I_Value(5.0)                             // (A)  堵转过流值
#define StallRecoverTime                (500)                                    // (ms) 启动运行时间
#define StallProtectRestartTimes        (5)                                 

/*启动保护*/
#define StartProtectRestartTimes        (5)                                      // 启动保护重启次数，单位：次


 /******* 初始位置检查参数 **********/
 #define PosCheckEnable                 (1)                                      // 初始位置使能
 /******* 初始位置参数设置 **********/
 #define InjectTime                     (Short_Inject) 
 #define Inject_On_Foc_Int_Cnt          (6.0)                                   //单位微妙 通三相的时间
 #define Inject_Off_Foc_Int_Cnt         (20.0)                                   //单位微妙 通三相的时间

 #define Inject_Step1_Voltage_Proportion   (32767*0.45)                           //小于等于Inject_Step2_Voltage_Proportion
 #define Inject_Step2_Voltage_Proportion   (32767*0.45)                           //大于大于Inject_Step1_Voltage_Proportion
 
 
/******启停测试参数******/
#define StartONOFF_Enable               (0)
#define StartON_Time                    (2000)                                 // (ms) 启动运行时间
#define StartOFF_Time                   (12000)                                 // (ms) 停止时间

#define StopBrakeFlag                   (0)
#define StopWaitTime                    (8000)                                  // (ms) 刹车等待时间

#endif
